﻿using System;
using System.Collections.Generic;
using System.Text;
using PCDoctor.Utils;
using Microsoft.Win32;

namespace PCDoctor.ScanParameters
{
    //PathsValues - словарь параметров сканирования
    //Name - название параметра сканирования (например "Кеширование DNS")
    //Scan - проверяет себя и возвращает true, если все Ок
    //
    //FixationKind - enum { Fixed, Error, FixAfterReboot }
    public abstract class ScanParameter
    {
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="name">Название проблемы</param>
        /// <param name="path">Адрес</param>
        /// <param name="value">Значение</param>
        public ScanParameter(string name, string path, string value, Int64 problemId)
        {
            ProblemsCount = 0;
            Result = ScanResult.NotScanned;
            Name = name;
            ProblemId = problemId;
            PathsValues.Add(path, value);
        }

        public void AddParameter(string path, string value)
        {
            PathsValues.Add(path, value);
        }

        /// <summary>
        /// Список параметров проблемы
        /// </summary>
        protected IDictionary<string, string> PathsValues = new Dictionary<string, string>();

        /// <summary>
        /// Название параметра сканирования например "Настройки TCP/IP"
        /// </summary>
        public String Name { get; private set; }

        /// <summary>
        /// Количество проблем, связанных с данным параметром
        /// </summary>
        public int ProblemsCount { get; set; }

        /// <summary>
        /// Количество исправленных методом Fix() проблем
        /// </summary>
        public int FixedProblems { get; set; }

        /// <summary>
        /// Результат проверки параметра - ОК, плохо, очень плохо и т.д.
        /// </summary>
        public ScanResult Result { get; protected set; }

        /// <summary>
        /// Результат исправления проблем
        /// </summary>
        public FixationResult FixResult { get; protected set; }

        public ScanFixerKinds Kind { get; protected set; }

        /// <summary>
        /// Сканируем, используя список параметров
        /// </summary>
        /// <returns>bool</returns>
        public virtual bool Scan()
        {
            return false;
        }

        /// <summary>
        /// Результат исправления проблемы
        /// </summary>
        /// <returns>FixationResult</returns>
        public virtual FixationResult Fix()
        {
            return FixationResult.Fixed;
        }

        /// <summary>
        /// ID проблемы, используется для создания ключей резервной копии
        /// в реестре Windows
        /// </summary>
        protected Int64 ProblemId { get; set; }

        /// <summary>
        /// Резервное копирование текущих настроек
        /// </summary>
        /// <param name="path">Путь</param>
        /// <param name="value">Значение</param>
        /// <param name="exists">Задано ли значение</param>
        public void DoBackup(string path, string value, string paramName)
        {
            RegistryKey hauberk = Registry.LocalMachine.OpenSubKey("Software\\Hauberk Software", true);
            if (hauberk == null)
            {
                hauberk = Registry.LocalMachine.CreateSubKey("Software\\Hauberk Software");
            }
            RegistryKey backupKey = Registry.LocalMachine.OpenSubKey("Software\\Hauberk Software\\PCDoctorBackup", true);
            if (backupKey == null)
            {
                backupKey = Registry.LocalMachine.CreateSubKey("Software\\Hauberk Software\\PCDoctorBackup");
            }
            RegistryKey problemKey = backupKey.OpenSubKey("problem_" + ProblemId.ToString() +
                "__param_" + paramName);
            if (problemKey == null)
            {
                problemKey = backupKey.CreateSubKey("problem_" + ProblemId.ToString() +
                    "__param_" + paramName);
                problemKey.SetValue("Path", path, RegistryValueKind.String);
                problemKey.SetValue("Value", value, RegistryValueKind.String);
                problemKey.SetValue("FixerKind", (int)Kind, RegistryValueKind.DWord);
            }
        }

        /// <summary>
        /// Восстановление значения по умолчанию, которое было
        /// до установки PCDoctor
        /// </summary>
        public virtual void RestoreDefault()
        {
        }
    }

}